4.8 数值稳定性和模型初始化

要点
  • 合理的权重初始值和激活函数的选取可以提升数值稳定性
  • Xavier 初始化把神经元的值、参数和参数的梯度当做随机变量,研究传播过程中神经元值、神经元处梯度的变化,用来选取合理的初始值,保持神经元参数、神经元梯度大小的期望与方差不变
  • 数值稳定指的是各个节点的神经元的值(和梯度)不会太大也不会太小

1. 神经网络的梯度

4.8 数值稳定性和模型初始化.png|center|500 中间的乘法是矩阵乘法,对于向量来说是 Jacobian matrix

笔记

向量关于向量的导数是矩阵,矩阵关于矩阵的导数是张量

神经网络中神经元的值很大,正向传播会计算不下去,而神经元越大,该神经元的梯度有可能越大,例如:假设我们有一个单层神经网络, 它只有一个神经元和一个权重。我们将使用线性激活函数 f(x)=x 。神经网络的输出是 y=wx, 其中 x 是输入, w 是权重。
现在, 我们希望最小化损失函数 L=(yt)2, 其中 t 是目标值。为了最小化损失, 我们需要计算损失函数相对于权重 w 的梯度, 即 dLdw
按照链式法则, 我们有:

dLdw=dLdydydw

其中,

dLdy=2(yt)dydw=x

将这两个导数相乘, 我们得到:

dLdw=2(yt)x=2(wxt)x

从这个公式中, 我们可以看到, 如果输入 x 的值较大, 那么梯度 dLdw 也会较大。这意味着, 在更新权重时, 如果我们使用的学习率过高, 权重的更新可能会非常大, 可能会导致权重在优化过程中震荡, 而不是稳定地收敛到最小损失值。

所以我们要尽量控制神经元的值不能太大,也不能太小(太小会出现梯度消失)

4.8 数值稳定性和模型初始化-1.png|center|500 元素函数的求导会出现对角矩阵

4.8 数值稳定性和模型初始化-2.png|center|500 假设用 ReLu 作为激活函数的话,会出现梯度爆炸

2. 梯度爆炸、梯度消失出现的问题

4.8 数值稳定性和模型初始化-5.png|center|500
4.8 数值稳定性和模型初始化-7.png|center|500 这里顶部指的是靠近 y 的那一侧,因为反向传播计算是从顶部累乘到底部

3. 训练更加稳定的几种方法

3.1 Xavier 初始化

为了解决梯度爆炸问题,我们希望把每一层的梯度控制在一个合理范围内(固定期望的方差的范围),我们研究一下梯度在每层之间的流动:
4.8 数值稳定性和模型初始化-10.png|center|500 神经网络示意图: ht=Wht1
有以下三点假设,对于某固定第 t 层:

  • 第一点:参数是我们可以控制的,所以我们做了一个简单的假设
  • 第二点:输入的特征之间是独立的,这也是一个较强的假设(例如训练样本为图像,相邻之间的像素往往不是独立的,但像素比较多,近似可以认为两两独立)
  • 第三点:当前层的参数与输入的特征无关,这也很好理解,因为当前层输入是上一层的参数决定的
  • 这里对 ht 只是要求独立,对值的分布没有要求

正向传播数值分布

正向传播的基本公式是:

ht=Wtht1

现在计算 t 层激活函数值的期望与方差:

E[hit]=E[jwi,jthjt1]=jE[wi,jt]E[hjt1]=0Var[hit]=E[(hit)2]E[hit]2=E[(jwi,jthjt1)2]=E[j(wi,jt)2(hjt1)2+jkwi,jtwi,kthjt1hkt1]=jE[(wi,jt)2]E[(hjt1)2]=jVar[wi,jt]Var[hjt1]=nt1γtVar[hjt1]

注意 wi,jtwi,kthjt1hkt1 里面两两相互独立,所以期望和为 0,根据以上结论,在满足 E[wi,jt]=0,Var[wi,jt]=γt 假设下,激活函数值的期望自动变为 0,而方差会做一个扩大,我们希望方差保持不变,则需要满足:

(1)γt=1nt1

反向传播数值分布

根据链式法则:

ht1=htWt
注意

反向传播正向传播本质都是矩阵乘法,上面等式两边是 Jacobian matrix,矩阵大小:1nt1=1nt1nt1nt,按照正向传播写法:

(ht1)T=(Wt)T(ht)T

(ht1)T 记为 st1 的梯度向量,(Wt)T 记作 W,则有:

st1=Wst

与 正向传播是类似的,若要梯度在传播时保持均值,方差不变,则需要:

(2)γt=1nt

根据归纳法,我们只需要设定初始的参数值就可以,从而在传播过程中保持数值的稳定性

注意到(1)、(2)式子难以同时满足,为了做一个权衡:

γt(nt1+nt)/2=1γt=2/(nt1+nt)

所以每一层的参数按照以下分布进行初始化:

分布 U[a,a] 和方差是 a2/3

加上激活函数

4.8 数值稳定性和模型初始化-11.png|center|500 正向
4.8 数值稳定性和模型初始化-13.png|center|500 反向
假设激活函数是线性的,要满足传播过程中正向和反向数值稳定,方差不会变化太大,则要求线性函数只能是 y=x,这给我们一个启发:在原点附近激活函数可以近似认为是线性的,激活函数必须满足:

  1. 过原点
  2. 0 点导数为 1

4.8 数值稳定性和模型初始化-14.png|center|500 Sigmoid 函数需要调整一下,使得在原点附近近似为 y=x

4. 打破对称性

考虑一个只有两个神经元的隐藏层,这两个神经元如果初始化的时候参数一致,向前传播的参数值大小是一致的,向后传播对于参数的更新也是一致的,由于对称性这两个神经元本质没有什么不同(等价于一个神经元),所以在初始化的时候避免参数取值一致

随机梯度下降无法打破对称性,因为对于参数的更新还是对称的,dropout 可以打破对称性,原因是训练的时候随机关闭了一些神经元(参考 [[4.6 Dropout]])

参考文献



© 2023 yanghn. All rights reserved. Powered by Obsidian